#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "FreeRTOS.h"
#include "timers.h"
#include "task.h"
#include "key.h"
#include "beep.h"
#include "OLED_I2C.h"
#include "lsens.h"
#include "ultrasonic.h"
#include "DHT11.h"
#include "queue.h"  // 队列相关的类型和函数声明在这里


#define START_TASK_PRIO		1
#define START_STK_SIZE 		128  
TaskHandle_t StartTask_Handler;
void start_task(void *pvParameters);




#define RX_TIMEOUT_MS 10  // 超时时间，单位毫秒
#define RX_BUFFER_SIZE 256 // 接收缓冲区大小
#define QUEUE_LENGTH 5    // 队列长度
#define QUEUE_ITEM_SIZE RX_BUFFER_SIZE // 队列项大小

// 接收缓冲区和相关变量
uint8_t rxBuffer[RX_BUFFER_SIZE];
uint8_t rxIndex = 0;
TickType_t lastRxTime = 0;

// 队列句柄
QueueHandle_t xQueue;


// 定时器句柄
TimerHandle_t xTimerHandleObj;




// 定时器任务函数
void vTimerCallback( TimerHandle_t xTimer )
{
    uint8_t strBuff[QUEUE_ITEM_SIZE];
    TickType_t currentTicks = xTaskGetTickCount();
    // 将当前系统时间转换为字符串
    snprintf((char *)strBuff, QUEUE_ITEM_SIZE, "Current ticks: %lu", (unsigned long)currentTicks);

}


int main(void)
{
    BaseType_t xReturn;
    delay_init();	    				//延时函数初始化	 
    uart_init(115200);					//初始化串口
    KEY_Init();         				//初始化与按键连接的硬件接口
    LED_Init();
    BEEP_Init();         				//初始化蜂鸣器端口

    // 设置优先级分组为分组2：2位抢占优先级，2位响应优先级
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

    // EXTI_PD0_Init();

    printf("App Start 2025 07 28!-------------\r\n");

	//创建开始任务
    xReturn = xTaskCreate((TaskFunction_t )start_task,            //任务函数
                        (const char*    )"start_task",          //任务名称
                        (uint16_t       )START_STK_SIZE,        //任务堆栈大小
                        (void*          )NULL,                  //传递给任务函数的参数
                        (UBaseType_t    )START_TASK_PRIO,       
                        (TaskHandle_t*  )&StartTask_Handler); 
                                    
    if (xReturn != pdPASS) 
    {
        // 任务创建失败，打印错误信息
        printf("Failed to create start_task!\r\n");
        while (1) 
        {
            // 进入死循环，避免程序继续执行
        }
    }

    vTaskStartScheduler();          //开启任务调度

    // 如果任务调度器启动失败，会执行到这里
    printf("Failed to start scheduler!\r\n");
    while (1) 
    {
        // 进入死循环，避免程序继续执行
    }
}

//开始任务任务函数
void start_task(void *pvParameters)
{

    taskENTER_CRITICAL();           //进入临界区

    // 创建定时器任务，每五秒触发一次
    xTimerHandleObj = xTimerCreate(
        "TimerTask",         // 定时器名称
        pdMS_TO_TICKS(1000), // 定时器周期，单位毫秒
        pdTRUE,              // 自动重载模式
        ( void * ) 0,        // 定时器 ID
        vTimerCallback       // 定时器回调函数
    );
		
				
    if( xTimerHandleObj != NULL )
    {
        // 启动定时器
        xTimerStart( xTimerHandleObj, 0 );
    }

    vTaskDelete(StartTask_Handler); //删除开始任务
    taskEXIT_CRITICAL();            //退出临界区
}

